import javax.swing.JTextArea;

/**
 * 线性表类
 * 
 * @author 杨满球（本地） 2016-09-15
 */
public class LinearList {

	private int[] linearList = null;// 线性表数组
	private int length = 0;// 线性表的元素个数

	/**
	 * 构造方法
	 * 
	 * @param size
	 *            线性表的大小
	 * @throws Exception
	 *             小于零的线性表大小非法
	 */
	public LinearList(int size) throws Exception {
		if (size < 0) {// 如果线性表的大小小于零抛出异常
			throw new Exception("Size is illegal!");
		}
		// 开辟数组空间
		linearList = new int[size];
	}

	/**
	 * 为线性表批量赋值
	 * 
	 * @param inputStr
	 *            以逗号分隔的字符串
	 * @throws Exception
	 *             ①如果字符串解析所得数组元素个数大于线性表大小，抛出错误 ②如果字符串无法解析为int时，抛出错误
	 */
	public void setValues(String inputStr) throws Exception {
		// 分割所得字符串为数组
		String[] input = inputStr.split(",");
		if (input.length > linearList.length) {// 如果所输入的数组大于线性表大小，抛出错误
			throw new Exception("Out of Size!");
		}
		// 循环将数组赋值给线性表
		for (int i = 0; i < input.length; i++) {
			this.linearList[i] = Integer.parseInt(input[i]);
			// 累加线性表的元素个数
			length++;
		}
	}

	/**
	 * 清空线性表
	 */
	public void clear() {
		length = 0;
	}

	/**
	 * 获得线性表的元素个数
	 * 
	 * @return 线性表的元素个数
	 */
	public int getLength() {
		return length;
	}

	/**
	 * 根据所给的index返回对应元素的值
	 * 
	 * @param index
	 *            元素的索引
	 * @return index所对应的值
	 * @throws Exception
	 *             index小于零或者大于元素最大索引
	 */
	public int getValue(int index) throws Exception {
		if (index < 0 || index >= length) {// 所给index小于零或者大于最大索引，抛出异常
			throw new Exception("Index is illegal!");
		}
		// 返回线性表index对应的元素的值
		return linearList[index];
	}

	/**
	 * 判断线性表是否为空
	 * 
	 * @return 线性表为空返回true，线性表不为空返回false
	 */
	public boolean isEmpty() {
		return length == 0;
	}

	/**
	 * 在index元素的前面插入一个值为value的元素
	 * 
	 * @param index
	 *            要出入元素的后一个元素索引
	 * @param value
	 *            要插入的元素的值
	 * @throws Exception
	 *             ①线性表已经满了，抛出异常 ②index小于零或者大于线性表最后一个元素，抛出异常
	 */
	public void insertValue(int index, int value) throws Exception {
		if (length == linearList.length) {// 如果线性表已经满了，抛出异常
			throw new Exception("Linear list is fulled!");
		}
		if (index < 0 || index > length) {// 如果index小于零或者大于线性表最大索引，抛出异常
			throw new Exception("Index is illegal!");
		}
		// 将出入处之后的元素向后移动
		for (int i = length; i > index; i--) {
			linearList[i] = linearList[i - 1];
		}
		// 插入元素
		linearList[index] = value;
		// 增加元素个数
		length++;
	}

	/**
	 * 移除一个元素
	 * 
	 * @param index
	 *            要移除的元素索引
	 * @throws Exception
	 *             index小于零或者大于线性表的最大索引，抛出异常
	 */
	public void delect(int index) throws Exception {
		if (index < 0 || index >= length) {// 如果index小于零或者大于线性表最大元素索引，抛出异常
			throw new Exception("Index is illegal!");
		}
		// 将需要移除的元素后面的元素向前移动
		for (int i = index; i < length - 1; i++) {
			linearList[i] = linearList[i + 1];
		}
		// 减少线性表元素个数
		length--;
	}

	/**
	 * 查找给定值在线性表中的索引
	 * 
	 * @param value
	 *            给定的值
	 * @return 给定值value在线性表中第一次出现的索引，如果线性表中没有该元素，返回-1
	 */
	public int find(int value) {
		int i;
		// 循环查找是否有与该值相等的元素
		for (i = 0; i < length; i++) {
			if (linearList[i] == value) {// 如果有与给定值相等的元素，终止循环
				break;
			}
		}
		if (i < length) {// 迭代数小于线性表元素个数，找到了该元素
			return i;
		} else {// 迭代数大于线性表个数，线性表中不存在给元素
			return -1;
		}
	}

	/**
	 * 向一个JTextArea输出线性表，使用逗号分隔元素
	 * 
	 * @param textShow
	 *            输出线性表的JTextArea
	 */
	public void showLinearList(JTextArea textShow) {
		if (length > 0) {// 线性表中有元素
			// 循环组装String以便输出
			String showStr = linearList[0] + "";
			for (int i = 1; i < length; i++) {
				showStr = showStr + "," + linearList[i];
			}
			// 输入到JTextArea
			textShow.setText(showStr);
		} else {// 线性表中没有元素
			textShow.setText("The linear list is empty!");
		}
	}
}
